# 编译器路径
CLANG      = d:/llvm-mingw-20201020-ucrt-x86_64/llvm-mingw
CC           = $(CLANG)/bin/clang
CPPC         = $(CLANG)/bin/clang++
GCC_DIR      = "D:\gcc-arm-10.2-2020.11-mingw-w64-i686-arm-none-eabi"#gcc-arm路径
Target_arm = arm-none-gnueabi#交叉编译目标
#：编译器路径


# 相关路径
TARGET文件名     = hello.exe # 可执行文件的名字
目标路径win64           = ./生成win64#生成的目标文件路径
目标路径arm32           = ./生成arm32#生成的目标文件路径
源文件路径         = ./src/#源文件路径
本地include路径    =./include#本地路径
SRC_C文件       := $(wildcard $(源文件路径)*.c)# 正则表达式表示目录下所有c文件，相当于：SRCS = main.c a.c b.c
SRC_CPP文件     := $(wildcard $(源文件路径)*.cpp)
OBJ_C文件名         := $(patsubst %c, %o, $(notdir $(SRC_C文件)))# OBJS表示SRCS中把列表中的.c全部替换为.o，相当于：OBJS = main.o a.o
OBJ_CPP文件名       := $(patsubst %cpp, %o, $(notdir $(SRC_CPP文件)))
OBJ文件_win64_C     := $(addprefix $(目标路径win64)/,$(OBJ_C文件名))#增加路径
OBJ文件_win64_CPP   := $(addprefix $(目标路径win64)/,$(OBJ_CPP文件名))
OBJ文件_arm32_C     := $(addprefix $(目标路径arm32)/,$(OBJ_C文件名))
OBJ文件_arm32_CPP   := $(addprefix $(目标路径arm32)/,$(OBJ_CPP文件名))
汇编文件_win64_C      := $(patsubst %o, %asm, $(OBJ文件_win64_C))
汇编文件_win64_CPP    := $(patsubst %o, %asm, $(OBJ文件_win64_CPP))
汇编文件_arm32_C      := $(patsubst %o, %s, $(OBJ文件_arm32_C))
汇编文件_arm32_CPP    := $(patsubst %o, %s, $(OBJ文件_arm32_CPP))
#：相关路径


##  编译选项
#   编译选项----C/C++
CXFLAG    +=  -O3 #优化级别
CXFLAG    +=  -I $(本地include路径) 
CXFLAG    += -static#静态
CXFLAG    += -fmessage-length=0 #编译过程中，输出信息会根据控制台的宽度自动换行
CXFLAG    += -Wall -Waggregate-return -Winline -Wunreachable-code -Wundef #编译显示警告
#CXFLAG    += -Wno-char-subscripts -Wno-strict-aliasing #关闭警告
#CXFLAG    += -fno-omit-frame-pointer -mapcs -mno-sched-prolog 
#CXFLAG    += -c # -c , 编译和汇编，但不要链接
CPPFLAG    += -std=c++20#C、C++语言标准
CFLAG      += -std=c18#C、C++语言标准
#   编译选项----win64
CXFLAG_win64    += --target=x86_64-w64-mingw32
#CXFLAG_win64    += -march=native -msse -msse2 -mfpmath=sse
#CXFLAG_win64    += -g#输出调试信息
CXFLAG_win64    += -D _win64系统
#   编译选项----arm32
CXFLAG_arm    += --target=$(Target_arm)
CXFLAG_arm    += --sysroot=$(GCC_DIR)#切换到交叉编译工具的路径
CXFLAG_arm    +=  $(INC_GCC_Arm)
CXFLAG_arm    += -mcpu=cortex-a9
#CXFLAG_arm    += -mfloat-abi=softfp #浮点方式softfp
CXFLAG_arm    += -mfpu=neon -ftree-vectorize #浮点单元neon
CXFLAG_arm    += -rtlib=libgcc#链接gcc的运行时库
CXFLAG_arm    += -fuse-ld=lld#lld作链接
#CXFLAG_arm    += -libstdc++
#CXFLAG_arm    += -nodefaultlibs
#CXFLAG_arm    += -lc -lc_nonshared
CXFLAG_arm    += -stdlib=libstdc++
CXFLAG_arm    += 
#CXFLAG_arm    += -v#输出编译过程中信息
#CXFLAG_arm    += -g#输出调试信息
CXFLAG_arm    += 
CXFLAG_arm    += 
CXFLAG_arm    += 
##  编译选项


# 宏
CFLAG    += -D LITTLE_ENDIAN_TYPE 
CFLAG    += -D CORE0_LIB
#：宏


# arm
all: $(OBJ文件_arm32_C) $(OBJ文件_arm32_CPP) 
	@echo ================ make ok, output: $(OBJ文件_arm32_C) $(OBJ文件_arm32_CPP) ================
$(目标路径arm32)/%.o: $(源文件路径)%.cpp  
	$(CPPC)  $(CXFLAG) $(CXFLAG_arm) $(CPPFLAG) $< -c -o $@
$(目标路径arm32)/%.o: $(源文件路径)%.c  
	$(CC)  $(CXFLAG) $(CXFLAG_arm) $(CFLAG) $< -c -o $@
all: $(汇编文件_arm32_C) $(汇编文件_arm32_CPP)
$(目标路径arm32)/%.s: $(源文件路径)%.cpp 
	$(CPPC)  $(CXFLAG) $(CXFLAG_arm) $(CPPFLAG) $< -S -o $@
$(目标路径arm32)/%.s: $(源文件路径)%.c 
	$(CC)  $(CXFLAG) $(CXFLAG_arm) $(CFLAG) $< -S -o $@
#：arm

# win64
all: $(目标路径win64)/$(TARGET文件名) 
#$(目标路径win64)/$(TARGET文件名):  $(OBJ文件_win64_C) $(OBJ文件_win64_CPP)
$(目标路径win64)/$(TARGET文件名):  $(OBJ文件_win64_CPP)
	@echo ================ make ok, output: $(目标路径win64)/$(TARGET文件名) ================
	$(CPPC)  $(CXFLAG) $(CXFLAG_win64)  $(CPPFLAG) $^ -o $@
$(目标路径win64)/%.o: $(源文件路径)%.cpp  
	$(CPPC)  $(CXFLAG) $(CXFLAG_win64) $(CPPFLAG) $< -c -o $@
$(目标路径win64)/%.o: $(源文件路径)%.c  
	$(CC)  $(CXFLAG) $(CXFLAG_win64) $(CFLAG) $< -c -o $@
all: $(汇编文件_win64_C) $(汇编文件_win64_CPP)
$(目标路径win64)/%.asm: $(源文件路径)%.cpp 
	$(CPPC)  $(CXFLAG) $(CXFLAG_win64) $(CPPFLAG) $< -S -o $@
$(目标路径win64)/%.asm: $(源文件路径)%.c 
	$(CC)  $(CXFLAG) $(CXFLAG_win64) $(CFLAG) $< -S -o $@
#：win64


# all: $(目标路径arm32)/$(TARGET文件名)	
# $(目标路径arm32)/$(TARGET文件名):  $(OBJ文件_arm32_C) $(OBJ文件_arm32_CPP)
# 	@echo ================ make ok, output: $(目标路径arm32)/$(TARGET文件名) ================
# 	$(CC)  $(CXFLAG) $(CXFLAG_arm)  $(CFLAG) $^ -o $@ 
# $(目标路径arm32)/%.o: $(源文件路径)/%.cpp  
# 	$(CPPC)  $(CXFLAG) $(CXFLAG_arm) $(CPPFLAG) $< -c -o $@
# $(目标路径arm32)/%.o: $(源文件路径)/%.c  
# 	$(CC)  $(CXFLAG) $(CXFLAG_arm) $(CFLAG) $< -c -o $@
# all: $(汇编文件_arm32_C) $(汇编文件_arm32_CPP)
# $(目标路径arm32)/%.s: $(源文件路径)/%.cpp 
# 	$(CPPC)  $(CXFLAG) $(CXFLAG_arm) $(CPPFLAG) $< -S -o $@
# $(目标路径arm32)/%.s: $(源文件路径)/%.c 
# 	$(CC)  $(CXFLAG) $(CXFLAG_arm) $(CFLAG) $< -S -o $@


# all: $(OBJ文件arm32)	
# $(目标路径arm32)/%.o: $(源文件路径)%.c  
# 	$(CC)  $(CFLAG) $(CFLAG_arm) $< -c -o $@
# all:$(汇编文件arm32)	
# $(目标路径arm32)/%.s: $(源文件路径)%.c 
# 	$(CC)  $(CFLAG) $(CFLAG_arm) $< -S -o $@




.PHONY : clean
clean:
	cd $(目标路径win64)  && del  *.o , *.asm , *.obj ,*.exe
	cd $(目标路径arm32) && del  *.o , *.s , *.obj ,*.exe
	